<?php
/**
 * 分页类
 */
declare(strict_types=1);

namespace Libraries;

class Pager
{
    /**
     * 构建链接，私有函数
     * @param string $strUrlPre 链接前缀
     * @param int $intPageNum 页数，数字
     * @param int $intCurPage 当前页数
     * @param string $strUrlFirstPage 第一页的链接，一般应SEO要求，不显示数字页码
     * @return string 返回的链接字符串
     */
    private static function genUrl(
        string $strUrlPre,
        int $intPageNum,
        int $intCurPage,
        string $strUrlFirstPage = ''
    ): string {
        if ($intPageNum == $intCurPage) {
            return 'javascript:void(0);'; // or #
        } else {
            return (($intPageNum == 1 && !empty($strUrlFirstPage)) ? $strUrlFirstPage : $strUrlPre . $intPageNum);
        }
    }

    /**
     * 按具体参数获取分页的信息
     * @param string $strUrlPre 链接前缀
     * @param int $intItemTotal 数据总条数
     * @param int $intItemPerPage 每页显示的数据条数
     * @param int $intCurPage 当前第几页
     * @param int $intShowNum 当前面前后显示几页
     * @param string $strUrlFirstPage 第一页的链接，一般应SEO要求，不显示数字页码
     * @return array $arrRe $arrRe['info'] 分页的信息，$arrRe['links'] 分页的链接数组
     */
    public static function getInfo(
        string $strUrlPre,
        int $intItemTotal,
        int $intItemPerPage = 20,
        int $intCurPage = 1,
        int $intShowNum = 5,
        string $strUrlFirstPage = ''
    ): array {
        $intPageTotal = (int)ceil($intItemTotal / $intItemPerPage);
        $arrRe = [
            'info' => [
                'item_total'    => $intItemTotal,
                'page_total'    => $intPageTotal,
                'item_per_page' => $intItemPerPage,
                'page_current'  => $intCurPage,
            ],
            'links' => [],
        ];
        if ($intPageTotal <= 1) {
            return $arrRe;
        }
        $intStart = $intCurPage - $intShowNum;
        $intEnd   = $intCurPage + $intShowNum;
        $intStart < 0 && $intEnd -= $intStart;
        $intEnd > $intPageTotal && $intStart -= ($intEnd - $intPageTotal);
        if ($intStart > 1) {
            array_push($arrRe['links'], [
                'n' => '1',
                'l' => self::genUrl($strUrlPre, 1, $intCurPage, $strUrlFirstPage),
            ]);
            $intStart > 2 && array_push($arrRe['links'], ['n' => '...', 'l' => '#']);
        }
        for ($i = $intStart; $i <= $intEnd; $i++) {
            if ($i >= 1 && $i <= $intPageTotal) {
                array_push($arrRe['links'], [
                    'n' => strval($i),
                    'l' => self::genUrl($strUrlPre, $i, $intCurPage, $strUrlFirstPage),
                ]);
            }
        }
        if ($intEnd < $intPageTotal) {
            if ($intEnd < $intPageTotal - 1) {
                array_push($arrRe['links'], ['n' => '...', 'l' => '#']);
            }
            array_push($arrRe['links'], [
                'n' => strval($intPageTotal),
                'l' => self::genUrl($strUrlPre, $intPageTotal, $intCurPage, $strUrlFirstPage),
            ]);
        }
        return $arrRe;
    }

    /**
     * 按具体参数获取分页的HTML
     * @param string $strUrlPre 链接前缀
     * @param int $intItemTotal 数据总条数
     * @param int $intItemPerPage 每页显示的数据条数
     * @param int $intCurPage 当前第几页
     * @param int $intShowNum 当前面前后显示几页
     * @param string $strUrlFirstPage 第一页的链接，一般应SEO要求，不显示数字页码
     * @return string $strHtml 按分页信息组成的HTML
     */
    public static function getHtml(
        string $strUrlPre,
        int $intItemTotal,
        int $intItemPerPage = 20,
        int $intCurPage = 1,
        int $intShowNum = 5,
        string $strUrlFirstPage = ''
    ): string {
        $arrInfo = self::getInfo(
            $strUrlPre,
            $intItemTotal,
            $intItemPerPage,
            $intCurPage,
            $intShowNum,
            $strUrlFirstPage
        );
        if (!$arrInfo['links']) {
            return '';
        }
        $strHtml = PHP_EOL;
        $strInputId = strval(mt_rand(100000, 999999));
        foreach ($arrInfo['links'] as $arrPage) {
            if (strval($intCurPage) == $arrPage['n']) {
                $strHtml .= '[' . $arrPage['n'] . ']';
            } else {
                $strHtml .= '<a href="' . $arrPage['l'] . '">' . $arrPage['n'] . '</a>' . PHP_EOL;
            }
        }
        $strHtml .= '<input type="text" id="id_pager_txt_' . $strInputId . '" style="width:40px; height:21px" />';
        $strHtml .= '<input type="button" value="GO" id="id_pager_btn_';
        $strHtml .= $strInputId . '" style="width:38px; height:21px" />' . PHP_EOL;
        $strHtml .= <<<JS
<script type="text/javascript">
    /* 输入框内回车事件 */
    document.getElementById('id_pager_txt_{$strInputId}').onkeypress = function(e) {
        if (e.keyCode == 13) {
            document.getElementById('id_pager_btn_{$strInputId}').click();
        }
    }
    /* GO按钮的点击事件 */
    document.getElementById('id_pager_btn_{$strInputId}').onclick = function(e) {
        var p = parseInt(document.getElementById('id_pager_txt_{$strInputId}').value);
        if (p > 0) {
            if (p > {$arrInfo['info']['page_total']}) {
                p = {$arrInfo['info']['page_total']};
            }
            if (p == 1 && '' != '{$strUrlFirstPage}') {
                window.location.href = '{$strUrlFirstPage}';
            } else {
                window.location.href = '{$strUrlPre}' + p;
            }
        } else {
            alert('输入的页码错误！');
            document.getElementById('id_pager_txt_{$strInputId}').value = '';
        }
    }
</script>
JS;
        return $strHtml;
    }
}
